package pers.xiqingbo.service.impl;

import pers.xiqingbo.dao.BookDao;
import pers.xiqingbo.dao.impl.BookDaoImpl;
import pers.xiqingbo.pojo.Book;
import pers.xiqingbo.pojo.Page;
import pers.xiqingbo.service.BookService;

import java.math.BigDecimal;
import java.util.List;

/**
 * @PackageName: pers.xiqingbo.service.impl
 * @ClassName: BookServiceImpl
 * @Description: 图书业务逻辑层接口实现类
 * @Author: Schieber
 * @Date: 2021/2/19 上午 10:18
 */
public class BookServiceImpl implements BookService {
    BookDao bookDao = new BookDaoImpl();

    /**
     * 添加图书业务
     *
     * @param book 添加的图书
     */
    @Override
    public void addBook(Book book) {
        bookDao.addBook(book);
    }

    /**
     * 删除图书业务
     *
     * @param id 删除图书的id
     */
    @Override
    public void deleteBook(Integer id) {
        bookDao.deleteBook(id);
    }

    /**
     * 修改图书业务
     *
     * @param book 修改的图书
     */
    @Override
    public void updateBook(Book book) {
        bookDao.updateBook(book);
    }

    /**
     * 通过id查询图书
     *
     * @param id 查询图书的id
     * @return 返回查询到的图书
     */
    @Override
    public Book queryBookById(Integer id) {
        return bookDao.queryBookById(id);
    }

    /**
     * 查询所有图书
     *
     * @return 返回查询到的所有图书列表
     */
    @Override
    public List<Book> queryBooks() {
        return bookDao.queryBooks();
    }

    /**
     * 对图书进行分页的业务
     *
     * @param pageNo   当前页码
     * @param pageSize 页面显示数据的数量
     * @return 返回分页后的图书对象
     */
    @Override
    public Page<Book> page(int pageNo, int pageSize) {
        Page<Book> page = new Page<>();
        // 求总记录数
        Integer totalNumber = bookDao.queryForPageTotalCount();
        // 设置总记录数
        page.setPageTotalCount(totalNumber);

        // 求总页码
        int totalCount = totalNumber / Page.PAGE_SIZE;
        // 如果取余后有多出的数据则页码数+1
        if (totalNumber % Page.PAGE_SIZE > 0) {
            totalCount += 1;
        }

        // 设置总页码
        page.setPageTotal(totalCount);

        // 设置当前页码
        page.setPageNo(pageNo);

        // 设置页面显示的数据数量
        page.setPageSize(pageSize);

        // 求当前页开始数据的索引
        int begin = (page.getPageNo() - 1) * Page.PAGE_SIZE;
        // 求当前页数据
        List<Book> pageBook = bookDao.queryForPageItems(begin, Page.PAGE_SIZE);
        // 设置当前页数据
        page.setItems(pageBook);

        return page;
    }

    /**
     * 对通过价格查询后的图书进行分页
     *
     * @param min      查询价格时的最小价格
     * @param max      查询价格时的最大价格
     * @param pageNo   当前页码
     * @param pageSize 页面显示数据的数量
     * @return 返回通过价格分页后的图书对象
     */
    @Override
    public Page<Book> pricePage(BigDecimal min, BigDecimal max, int pageNo, int pageSize) {
        Page<Book> pricePage = new Page<>();
        // 求通过价格区间查询后的总记录数
        Integer priceTotalNumber = bookDao.queryByPriceForCount(min, max);
        // 设置总记录数
        pricePage.setPageTotalCount(priceTotalNumber);

        // 求总页码
        int priceTotalCount = priceTotalNumber / Page.PAGE_SIZE;
        // 如果取余后有多出的数据则页码数+1
        if (priceTotalNumber % Page.PAGE_SIZE > 0) {
            priceTotalCount += 1;
        }
        // 设置总页码
        pricePage.setPageTotal(priceTotalCount);

        // 设置当前页码
        pricePage.setPageNo(pageNo);

        // 设置页面显示的数据数量
        pricePage.setPageSize(pageSize);

        // 求当前页开始数据的索引
        int begin = (pricePage.getPageNo() - 1) * Page.PAGE_SIZE;
        // 求当前页数据
        List<Book> pageByPriceForBook = bookDao.pricePage(min, max, begin, pageSize);
        // 设置当前页数据
        pricePage.setItems(pageByPriceForBook);

        return pricePage;
    }

}
